package com.dem.javatestwebsocket.chathandler;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dem.javatestwebsocket.model.ChatHistory;
import com.dem.javatestwebsocket.service.IChatHistory;
import com.dem.javatestwebsocket.util.SpringContextHolder;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


@ServerEndpoint(value = "/chat1/{userName}/{token}")
@Component
public class handlerchat {
    // session缓存
    private final static Map<String, Session> sessionMap = new HashMap<>();

    /**
     * 获取 chatHistoryService 服务
     */
    IChatHistory getHistoryService(){
        return SpringContextHolder.getBean(IChatHistory.class);
    }

    public handlerchat() {
        System.out.println("载入 Chat1WebSocket 构造方法");
    }
//Session表示一个 WebSocket 会话。它提供了与客户端通信的方法（如发送消息）。
    //@PathParam WebSocket 的 URL 路径中提取参数
    @OnOpen
    public void openConn(Session session, @PathParam("userName") String userName, @PathParam("token") String token) {
        String sessionId = session.getId(); //session.getId()获取当前 WebSocket 会话的唯一标识符（ID）。这个 ID 是由 WebSocket 框架自动生成的，
        System.out.println("建立ws连接: {}"+ sessionId);
        sessionMap.put(sessionId, session);
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) {   //表示关闭连接的原因，包含关闭状态码和描述信息
        String sessionId = session.getId();
        String reasonPhrase = reason.getReasonPhrase();
        System.out.println("关闭ws连接: {}, reason: {}"+ sessionId+ reasonPhrase);
        sessionMap.remove(sessionId);
    }

    @OnMessage
    public void echoTextMessage(Session session, String msg, boolean last) {
        if (session.isOpen()) {
            System.out.println("收到ws消息 = " + msg);
            // 给所有ws客户端广播消息
            sessionMap.values().forEach(otherSession -> {
                try {
                    otherSession.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    System.out.println("广播消息发生异常: " + e.getMessage());
                }
            });

            // 解析用户发送过来的json格式消息内容
            // 如果用户发送了非json数据,会导致异常.
            try {
                JSONObject jsonObject = JSONUtil.parseObj(msg);
                ChatHistory chatHistory = jsonObject.toBean(ChatHistory.class);
                IChatHistory historyService = getHistoryService();
                historyService.add(chatHistory);
            } catch (Exception e) {
                //
                System.err.println("解析json格式异常, json:" + msg);
            }


        }

    }}
